ERC-1271 : Standard Signature Validation Method for Contracts
Summary
ユーザーはassetを通常のEOAで持つか、multisig walletのようなスマートコントラクト上に持つことが出来る
しかし(onlyOwnerのような仕組みがあるため)private keyで署名されたアカウントでしか実行出来ないコントラクトが多い
アカウントがコントラクトであっても、与えられたsignatureがvalidかどうかを検証する仕組みが必要
Motivation
将来的に多くユーザーはassetをコントラクト上で持つようになり、使うsignatureとしてはECDSAに限定する必要はない
アカウントのように振る舞うコントラクトを smart account と呼ぶことにする
例: off-chainにある署名された売買の注文のメッセージを使う時にはEOAからはECDSA signatureを使えば良いが、コントラクトはprivate keyを持たないのでそれが出来ない
Specification
code: ERC-1271
pragma solidity ^0.5.0;
contract ERC1271 {
// bytes4(keccak256("isValidSignature(bytes,bytes)")
bytes4 constant internal MAGICVALUE = 0x20c13b0b;
/**
* @dev Should return whether the signature provided is valid for the provided data
* @param _data Arbitrary length data signed on the behalf of address(this)
* @param _signature Signature byte array associated with _data
*
* MUST return the bytes4 magic value 0x20c13b0b when function passes.
* MUST NOT modify state (using STATICCALL for solc < 0.5, view modifier for solc > 0.5)
* MUST allow external calls
*/
function isValidSignature(
bytes memory _data,
bytes memory _signature)
public
view
returns (bytes4 magicValue);
}
Rationale
WIP